From: Georges Basile Stavracas Neto Date: Thu, 26 Nov 2020 18:10:11 +0000 (-0300) Subject: appDisplay: Properly destroy SwipeTracker on destroy X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~708 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=853644d7fee0510a21289056a092a052be4527a2;p=gnome-shell.git appDisplay: Properly destroy SwipeTracker on destroy SwipeTracker connects to signals of the stage, but doesn't disconnect on destroy, leaving them hanging and potentially running callbacks for destroyed objects. This is visible when removing a folder by dragging all icons out, and running the swipe gestures, which will produce a bunch of warnings. Explicitly destroy, remove, and disconnect the swipe tracker. Part-of: --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index ac92d2fd9..c5fa78ee6 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -217,6 +217,12 @@ var BaseAppView = GObject.registerClass({ this._parentalControlsManager.disconnect(this._appFilterChangedId); this._appFilterChangedId = 0; } + + if (this._swipeTracker) { + this._swipeTracker.destroy(); + delete this._swipeTracker; + } + this._removeDelayedMove(); this._disconnectDnD(); } diff --git a/js/ui/swipeTracker.js b/js/ui/swipeTracker.js index a638d7801..fd13fd725 100644 --- a/js/ui/swipeTracker.js +++ b/js/ui/swipeTracker.js @@ -54,7 +54,8 @@ const TouchpadSwipeGesture = GObject.registerClass({ this._orientation = Clutter.Orientation.VERTICAL; this._enabled = true; - global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this)); + this._stageCaptureEvent = + global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this)); } get enabled() { @@ -125,6 +126,13 @@ const TouchpadSwipeGesture = GObject.registerClass({ return Clutter.EVENT_STOP; } + + destroy() { + if (this._stageCaptureEvent) { + global.stage.disconnect(this._stageCaptureEvent); + delete this._stageCaptureEvent; + } + } }); const TouchSwipeGesture = GObject.registerClass({ @@ -643,4 +651,16 @@ var SwipeTracker = GObject.registerClass({ this._velocity = 0; this._state = State.SCROLLING; } + + destroy() { + if (this._touchpadGesture) { + this._touchpadGesture.destroy(); + delete this._touchpadGesture; + } + + if (this._touchGesture) { + global.stage.remove_action(this._touchGesture); + delete this._touchGesture; + } + } });